package jp.co.dailyReport.project;

import java.sql.SQLException;
import org.apache.log4j.Logger;
import jp.co.dailyReport.ExecuterManager;
import jp.co.dailyReport.ConnectionFactory;
import jp.co.dailyReport.DataUnavailableException;
import jp.co.dailyReport.project.sql.PjStaffDeleteExecuter;
import jp.co.dailyReport.project.sql.PjStaffLoadExecuter;
import jp.co.dailyReport.project.sql.PjStaffInsertExecuter;
import jp.co.dailyReport.project.sql.PjStaffPIdLoadExecuter;
import jp.co.dailyReport.project.sql.PjStaffSIdLoadExecuter;
import jp.co.dailyReport.project.sql.PjStaffsLoadExecuter;
import jp.co.dailyReport.project.sql.PjStaffPSIDLoadExecuter;

/**
 * プロジェクト参加社員情報管理クラス
 */
public class PjStaffManager {

	private static Logger log = Logger.getLogger(PjStaffManager.class);

	/**
	 * プロジェクト参加社員情報を取得します。
	 * 
	 * @return プロジェクト参加社員オブジェクトの配列
	 * @throws DataUnavailableException
	 */
	public static PjStaff[] load() throws DataUnavailableException {

		ConnectionFactory connectionFactory = new ConnectionFactory();
		PjStaffsLoadExecuter pjStaffsLoadExecuter = new PjStaffsLoadExecuter();
		Object objs[] = (Object[])null;

		try {
			objs = ExecuterManager.execute(connectionFactory, pjStaffsLoadExecuter);
		} catch(SQLException sqle) {
			throw new DataUnavailableException(sqle.toString());
		}
		if(objs == null || objs.length == 0) {
			return new PjStaff[0];
		} else {
			return (PjStaff[])objs;
		}
	}

	/**
	 * プロジェクト参加社員情報を取得します。
	 * 
	 * @param pjStaffId 社員ID
	 * @return プロジェクト参加社員オブジェクト
	 * @throws DataUnavailableException
	 */
	public static PjStaff load(int pjStaffId) throws DataUnavailableException {

		ConnectionFactory connectionFactory = new ConnectionFactory();
		PjStaffLoadExecuter pjStaffLoadExecuter = new PjStaffLoadExecuter(pjStaffId);
		Object objs[] = (Object[])null;

		try {
			objs = ExecuterManager.execute(connectionFactory, pjStaffLoadExecuter);
		} catch(SQLException sqle) {
			throw new DataUnavailableException(sqle.toString());
		}
		if(objs == null || objs.length == 0) {
			return new PjStaff();
		} else {
			return (PjStaff)objs[0];
		}
	}

	/**
	 * プロジェクト参加社員情報を取得します。
	 * 
	 * @param staffId 社員ID
	 * @return プロジェクト参加社員オブジェクトの配列
	 * @throws DataUnavailableException
	 */
	public static PjStaff[] getProjectId(int staffId) throws DataUnavailableException {

		ConnectionFactory connectionFactory = new ConnectionFactory();
		PjStaffSIdLoadExecuter pjStaffSIdLoadExecuter = new PjStaffSIdLoadExecuter(staffId);
		Object objs[] = (Object[])null;

		try {
			objs = ExecuterManager.execute(connectionFactory, pjStaffSIdLoadExecuter);
		} catch(SQLException sqle) {
			throw new DataUnavailableException(sqle.toString());
		}
		if(objs == null || objs.length == 0) {
			return new PjStaff[0];
		} else {
			return (PjStaff[])objs;
		}
	}

	/**
	 * プロジェクト参加社員情報を取得します。
	 * 
	 * @param projectId プロジェクトID
	 * @return プロジェクト参加社員オブジェクトの配列
	 * @throws DataUnavailableException
	 */
	public static PjStaff[] getStaffId(int projectId) throws DataUnavailableException {

		ConnectionFactory connectionFactory = new ConnectionFactory();
		PjStaffPIdLoadExecuter pjStaffPIdLoadExecuter = new PjStaffPIdLoadExecuter(projectId);
		Object objs[] = (Object[])null;

		try {
			objs = ExecuterManager.execute(connectionFactory, pjStaffPIdLoadExecuter);
		} catch(SQLException sqle) {
			throw new DataUnavailableException(sqle.toString());
		}
		if(objs == null || objs.length == 0) {
			return new PjStaff[0];
		} else {
			return (PjStaff[])objs;
		}
	}

	/**
	 * プロジェクト参加社員情報を登録します。
	 * 
	 * @param pjStaff プロジェクト参加社員オブジェクト
	 * @throws DataUnavailableException
	 */
	public static void insert(PjStaff pjStaff) throws DataUnavailableException {

		ConnectionFactory connectionFactory = new ConnectionFactory();
		PjStaffInsertExecuter pjStaffInsertExecuter = new PjStaffInsertExecuter(pjStaff);
		try {
			ExecuterManager.execute(connectionFactory, pjStaffInsertExecuter);
		} catch(SQLException sqle) {
			log.error(sqle.toString(), sqle);
			throw new DataUnavailableException(sqle.toString());
		}
	}

	/**
	 * プロジェクト参加社員情報を削除します。
	 * 
	 * @param projectId プロジェクトID
	 * @param staffId 社員ID
	 * @throws DataUnavailableException
	 */
	public static void delete(int projectId,int staffId) throws DataUnavailableException {

		ConnectionFactory connectionFactory = new ConnectionFactory();
		PjStaffDeleteExecuter pjStaffDeleteExecuter = new PjStaffDeleteExecuter(projectId,staffId);

		try {
			ExecuterManager.execute(connectionFactory, pjStaffDeleteExecuter);
		} catch(SQLException sqle) {
			log.error(sqle.toString(), sqle);
			throw new DataUnavailableException(sqle.toString());
		}
	}

	/**
	 * プロジェクト参加社員情報の存在チェックを行います。
	 * 
	 * @param projectId プロジェクトID
	 * @param staffId 社員ID
	 * @return true→存在する、false→存在しない
	 * @throws DataUnavailableException
	 */
	public static boolean isExist(int projectId,int staffId) throws DataUnavailableException {

		ConnectionFactory connectionFactory = new ConnectionFactory();
		PjStaffPSIDLoadExecuter pjStaffPSIDLoadExecuter = new PjStaffPSIDLoadExecuter(projectId,staffId);
		Object objs[] = (Object[])null;

		try {
			objs = ExecuterManager.execute(connectionFactory, pjStaffPSIDLoadExecuter);
		} catch(SQLException sqle) {
			throw new DataUnavailableException(sqle.toString());
		}
		return objs != null && objs.length != 0;
	}

}